package com.perunlabs.testinjector.util; import static com.perunlabs.testinjector.util.Reflections.getElementAnnotations; import static com.perunlabs.testinjector.util.Types.typeOf; import static com.perunlabs.testinjector.util.Types.typeProvidedBy; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.List; import com.google.inject.BindingAnnotation; import com.google.inject.Key; import com.google.inject.TypeLiteral; public class Keys { public static Key<?> keyOf(Field field) { return getFieldKey(field, typeOf(field)); } public static Key<?> keyProvidedBy(Field field) { return getFieldKey(field, typeProvidedBy(field)); } private static Key<?> getFieldKey(Field field, TypeLiteral<?> typeLiteral) { List<Annotation> annotations = getElementAnnotations(field, BindingAnnotation.class); if (annotations.size() == 0) { return Key.get(typeLiteral); } if (annotations.size() == 1) { return Key.get(typeLiteral, annotations.get(0)); } throw new MoreThanOneBindingAnnotationException(field, annotations); } }